/**
 * @description
 * @author XIAJIUJIANG239
 * @createtime 2018/1/30
 */

/**
 * 实现可定时中断的 fetch 请求。
 * @param fetch_promise
 * @param timeout 请求时长
 * @returns {Promise.<*>}
 */
export default function fetchWrap(fetch_promise, timeout) {
  var abort_fn = null
  var abort_promise = new Promise(function (resolve, reject) {
    // 通过调用abort_fn() 就可以触发abort_promise 的 reject
    abort_fn = function () {
      reject('abort promise!!!')
    }
  })

  // 使用Promise.race，以最快 resolve 或 reject 的结果来传入后续绑定的回调
  var abortable_promise = Promise.race([
    fetch_promise,
    abort_promise
  ])
  abortable_promise.abort = abort_fn

  setTimeout(abort_fn, timeout)

  return abortable_promise
}


/**
 * 多天之后，再重温思路的一个demo函数。
 * 觉得上面的写的有些繁琐了。本函数即可实现。
 * 示例图片如下：
 *    ![delayFetch 示例](http://ojjslhnls.bkt.clouddn.com/blog/20180728/105659004.png)
 *    ——jiangxtx 2018-7-28
 *
 * @param targetFetch
 * @param delay
 * @returns {Promise.<*>}
 * @private
 */
function _fetch(targetFetch, delay) {
  delay = delay || 4000

  const delayedPromise = new Promise((resolve, reject) => {
    setTimeout(() => reject('fetch timeout!'), delay)
  })

  return Promise.race([
    targetFetch,
    delayedPromise,
  ])
}
